The purpose of this exercise is to help familiarize you with simple ways to explore attributes in various datasets. These skills will help you extract new datasets, connect to tabular data, and qualitatively compare different variables.

1 The Introduction

With the unprecedented growth in middle Tennessee, the Montgomery County Commission, Stormwater Management, and Health Department are working with the Tennessee Department of Environment and Conservation on an initiative to assess the relationship of brownfield sites to our community and watersheds. Brownfields are locations in communities that pose risks to future land use and development as a result of previous land use practices, particularly commercial and industrial (check out more information on brownfields here: https://www.osha.gov/brownfields/brownfields-qna). They often contain high levels of soil and water contamination, and in some cases pollutants can remain in the ecosystem for decades. Unfortunately, brownfields are often point source locations for ground and surface water contamination. The goal of the initiative is to determine if there are any spatial characteristics of these hazardous locations that have the potential to impact current and future residents of the area. The primary objectives of the initative are to: a) examine the location of brownfields in the county, b) determine which watersheds would be primarily impacted, and c) ascertain if there is a relationship between brownfield sites and any particular demographics in the county. With these three objectives, the county partners may make data-informed decisions to best support and prioritize programs that keep our community and environment safe.

In this exercise you will:

  • Continue working with geoprocessing tools
  • Obtain and import data from external sources
  • Learn to link tabular data
  • Qualitatively compare datasets

Software specific directions can be found for each step below. Please submit the answer to the questions and your final map by the due date.

1.1 Step One: The Data

The datasets used in this exercise will be found on the Exercise 5 Github Page, previous exercises such as Exercise 2 and Exercise 3, and also from the Tennessee Geographic Information Council. TN GIS maintains a number of datasets in their collections that are useful for projects involving the state of Tennessee.

View Directions in ArcGIS Pro

As with previous exercises you should begin by launching ArcGIS Pro, creating a new blank template, and creating a folder for this specific exercise. You should now see the typical starting screen that greeted you in all of the previous exercises. While some of the data you may already have in previous exercise folders, you will start his lab by downloading a dataset from TN GIS. While they maintain a number of quality collections, you will specifically download the statewide watershed coverage (12 digit Hydrologic Unit Code) for Tennessee. This information can be found at the following link: http://www.tngis.org/water.htm. On that page you will find the link for “Download Watershed Coverage”. Click the link, and using the download button Google Drive Download Button in the upper-right corner, save the tn_wbd zip file to your project folder.

TN GIS Water Data Download

Once you have downloaded the file, navigate to the saved location to unzip the file. Within the unzipped folder you will find three additional folders titled:

  • tn_8dig_huc
  • tn_12dig_huc
  • tn_250k_huc

These are watershed files at varying levels of detail. For hydrologic units you are looking for one with the largest number of digits to get the largest scale data. So for this exercise you will unzip the tn_12dig_huc dataset.

tn_12dig_huc.zip extract

Finally, with that final folder extracted you will find a folder titled hydrologic_units that will contain a shapefile named wbdhu12_a_tn.shp that will be used in this exercise. This is the polygon file representing the 12 digit hydrologic unit codes for the entire state of Tennessee.

Next, you will need the tornado_data file from Exercise 2 and the census_tracts data from Exercise 3. You have a few options for obtaining this data. You can download the data again (but this time to the new project folder), you can navigate to the Exercise 2 and Exercise 3 project folders, respectively, on your computer and copy the zip files to the Exercise 5 project folder, or you can copy the data over using the catalog pane in ArcGIS Pro. While the first two options are relatively straight forward, it is important to learn how to navigate and use the catalog in ArcGIS.

On the View tab, click the Catalog Pane button Catalong Pane Button to open the Catalog Window Pane on the right side of the screen. On the project tab, right-click on the folders option and click "Add Folder Connection. In the resulting window navigate to the folder you would like to connect to and single-click the folder to select it. You don’t want to double-click into the folder. You should see the name of the folder appear at the bottom of the window and the OK button should be available.

Accessing Catalog Pane

Once you have connected to the additional folders you want to use in conjunction with this project you can navigate to them within the Folders link in the Catalog Pane. While you could add data directly from the other folders, the best practice might be to copy the data from one project to another. If for example you plan to alter the data then using it directly from the previous folder would alter it there as well. This could cause future issues when returning to that project. For this exercise you can navigate to the Exercise 2 folder and copy the tornado_data file and paste it in the Exercise 5 folder. This is the safest way to move data such as shapefiles or geodatabases. Because the various data types contain numerous individual files to make up a dataset, catalog will copy/move them all correctly. If you tried to move them using File Explorer and missed one of the files associated with that data it might not work appropriately. So for Exercise 5, you will need to copy the tornado_data and montco_tracts data from exercises two and three respectively.

Copy and Paste Data in Catalog Pane

Finally, you will need to download the Brownfields and Demographics data from the Exercise 5, GitHub Data page. Save both in your Exercise 5 project folder and unzip the brownfields.zip file to access the dataset.

Question No. 1
Using File Explorer, examine the dataset contained in the brownfields.zip file and answer the following question:
What is the common name of the extracted files? How many are there? What are the various file extensions?
The library of Congress has a great description of the various extensions here.

View directions in QGIS

Blah…blah…blah…

Question No. 1
Insert Text Here

View directions in R

Before you begin, you will need to open the Ex2 Colab Notebook and insert tocolab after github in the URL to open in the Colab Environment. As you have seen before, R requires various packages to complete certain analyses. In this exercise you will be using tidyverse, OpenStreetMaps, ggfortify, maptools, and rgeos. To install and load the packages we will use the following script:

Blah…blah…blah…

Question No. 1
Insert Text Here

1.2 Step Two: The Analyses

The data collected in the previous section requires additional processing so you can reduce the dataset to only the pertinent information for the analyses. In this step you will use additional geoprocessing techniques and data management tools to link two datasets for further examination.

View Directions in ArcGIS Pro

With the data collected you can now add the brownfields, census tracts, tornado_data, and wbdhu12_a_tn (watersheds) data to your project. Although there are a number of ways of isolating data to make derived datasets (e.g. Select > Lasso in Exercise 4, Step 1), in this exercise you will use another tool from the Geoprocessing Toolbox to complete this task. On the View Tab click on the Geoprocessing Toolbox button Geoprocessing Button to open the Geoprocessing pane on the right side of the screen. By navigating through the tools menus you will find Select under Analysis Tools > Extract. With this tool you will write a simple expression to “select” a small portion of the data you need for further analysis. To do this, double-click the Select tool and in the resulting pane input the following parameters:

  • Input Features = tornado_data*
  • Output Feature Class = Here you will insert the file name you want to use. Click on the folder icon to the right of the field and in the new window save the file as montgomery_county.shp in your project folder.
  • Expression = Click the drop-down button for the new expression Expression Button button and use the drop-down boxes to provide the following information:
    • Where NAME   is equal to   Montgomery
    • Click Run

Select Geoprocessing Tool

*The tornado dataset is only being used to obtain a polygon for Montgomery County for the clip process in the next step.

This will add the new montgomery_county shapefile to your contents. You can now remove the tornado dataset because it will no longer be needed. With the polygon of Montgomery County available you can now use the Clip tool like in Exercise 4, Step One to clip the brownfields and watersheds datasets to reduce them to only those within Montgomery County. If you receive a “Datum conflict” warning, for the purposes of this exercise, you can ignore it an continue with the clip. Recall that the Input Features is the data you want to reduce, the Clip Feature is the data you want it to take the shape of, and Output Feature Class is what you are naming the new file. Refer back to Exercise 4, Step One for more information about Clip.

Select Clipped Datasets

With the new clipped datasets you can remove or just uncheck (in case you want to use them in your final map) the full brownfields and watersheds datasets to reduce clutter. You can also now zoom in closer to view only Montgomery County.

In the final step to prepare the data, you are going to connect a non-spatial data to the census tract dataset. In Step One you downloaded a file titled demographics.csv. This file contains comma-separated values detailing additional demographic data that you need to append to the census tract data. Although the process is relatively straight-forward, there are a number of steps that need to be taken in order to join the data.

First, if you haven’t already, add the demographics.csv file to your table of contents. This can be done from the Catalog Pane or with the “Add Data” button Add Data Button like in previous exercises. Because ArcGIS Pro treats *.csv files as “read only” you need to convert it to a table that can be edited in the software. Now, right-click on the demographics.csv standalone table and go to Data > Export Table. In the resulting window choose the following options:

  • Input Rows = demographics.csv
  • Output Location = Similar to before, navigate only to your project folder and click once to select. In the step you are simply designating the folder the file is to be saved.
  • Output Name = Give the file a new name such as demo_table.dbf

Before clicking OK, you need to expand the Fields section of the window and click on Tract in the Output Fields column. Then click on the Properties Tab and change the Type field to Text. Then click OK. If you continued without changing the field type, the variable would most likely be treated as a numerical value. If you open the attribute table for any dataset and mouse-over the variable column without clicking a pop-up window will appear detailing the Type and other parameters of the variable. In the census dataset from the previous exercise, the NAME variable is Type: Text (7). The seven in parenthesis means the max number of available characters is seven. So before you export a table it is good practice to make sure the variables match the variables you intend to join or that the variables will be treated in a manner necessary for additional analyses.

Export CSV to DBF

The new standalone table should have been added to the Table of Contents. If not you should add it now; the csv table can be removed. Now you can connect the new table to the census tract dataset. Begin by right-clicking on the census data and selecting Joins and Relates > Add Join. In the new Add Join window select the following options (your file names may vary):

  • Input Table = montco_tracts, or whatever you named the census tract information
  • Input Join Field = NAME
  • Join Table = demo_table, or whatever you named the new demographics data
  • Join Table Field = Tract

For this exercise keep the “Keep All Target Features” button checked and if you receive an warning about an indexing error with the census data you can ignore it for this exercise. Then click the Validate Join button. This will pop-up an new window that will describe the process of checking the two datasets to see if they can be joined. At the bottom of the dialog you should see a line that says there were 39 joins. Close that message and click OK to run the join.

Join Datasets

Finally, open the attribute table for the census tracts and scroll to the far right of the table. If the join worked properly you should see a number of additional fields added to the table.

Join Datasets, Attribute Table

This will provide all of the data and information you need to visualize the data and make comparisons of the watersheds.

Question No. 2
How many watersheds cover Montgomery County? Although they have been clipped from their original geometry, which watershed is the largest? Which is the smallest?

View Directions in QGIS

Blah…blah…blah…

Question No. 2
Insert Text Here

View Directions in R

Blah…blah…blah…

Question No. 2
Insert Text Here

1.3 Step Three: The Visualization

In this step you will need to examine the spatial distribution of brownfields within the watersheds of Montgomery County and make some qualitative interpretations of potentially impacted urban areas.

View directions in ArcGIS Pro

Examine the spatial distribution of the brownfield throughout the county. The clustering should be relatively apparent and might match up with your knowledge of industrial activities in the various areas of Montgomery County. In order to help quantify the number of brownfields in each watershed you can use a Spatial join to create a count variable for this information. To do this, right-click on the montgomery county watershed dataset and go to Join and Relates > Spatial Join

Spatial Join Datasets

In the resulting window, select the following parameters (your file names may vary):

  • Target Features = montgomery county watersheds
  • Join Features = montgomery county brownfields
  • Output Feature Class = This is where you name the new dataset. For continuity you can name it something like: brownfields_per_watershed.shp
  • Join Operation = Choose “Join one to one” from the drop-down menu
    • Keep all Target Features should remain checked Match Option = Choose “Intersect” from the drop-down menu

You can leave the remaining items blank and click OK.

Spatial Join Datasets Dialog

By examining the attribute table for the new dataset you should see a new variable called Join_Count. This is the number of brownfields that occur within each watershed.

Using the skills you learned in Exercises Two, Three, and Four you can now make a map that shows Montgomery County, the location of brownfields and watersheds in a graduated color scheme by number of brownfields. Remember to include cartographic elements such as legend, scale bar, north arrow, etc. In this visualization you may also want to add a different basemap or inset map that provides additional supporting information.

Question No. 3
Which watershed contains the most brownfields?

View directions in QGIS

Blah…blah…blah…

Question No. 3
Insert Text Here

View directions in R

Blah…blah…blah…

Question No. 3
Insert Text Here

1.4 Step Four: The County Commisson Report

After discussing the results of the previous analysis with your colleagues at County Commission, Stormwater Management, Health Department, and TDEC, they are interested in seeing how the location of brownfields impacts the community. Although the commission districts do not perfectly replicate the census tracts, the County Commissioners and the Health Department want to know if the brownfield sites are directly related to census tracts with large minority populations. They are concerned by a recently published report that states:

“While there is no single way to characterize communities located near our sites, this population is more minority, low income, linguistically isolated, and less likely to have a high school education than the U.S. population as a whole. As a result, these communities may have fewer resources with which to address concerns about their health and environment.”

During these discussions the Health Department would also like to know if the areas with a high number of brownfields have higher populations of children.

View directions in ArcGIS Pro

Using the skills you learned in this and previous exercises, create a new spatial join between the census tracts and brownfields datasets (for this exercise ignore any datum warning).

Question No. 4
Insert Text Here

View directions in QGIS

Blah…blah…blah…

Question No. 4
Insert Text Here

View directions in R

Blah…blah…blah…

Question No. 4
Insert Text Here

2 The Write-Up

Blah…blah…blah…

When complete, send a link to your Colab Notebook or word document with answers to Questions 1-4 and your completed map via email.

LS0tDQp0aXRsZTogIkV4ZXJjaXNlIDU6IFNpbXBsZSBEYXRhIEV4cGxvcmF0aW9uIDxicj48c21hbGw+R2VvZ3JhcGhpYyBJbmZvcm1hdGlvbiBTeXN0ZW1zIDEgTGFiPC9zbWFsbD48L2JyPiINCmF1dGhvcjogIkdFT0cgMzE1MCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICByb3dzLnByaW50OiAxMA0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGhpZ2hsaWdodDogYnJlZXplZGFyaw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQogIG1vZGU6IGdmbQ0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiA0MHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLnpvb20gew0KICB0cmFuc2Zvcm0tb3JpZ2luOiA0MCUgNTAlIDA7DQogIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMnM7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KLnpvb20gaW1new0KCXdpZHRoOmF1dG87DQoJaGVpZ2h0OmF1dG87CQ0KfQ0KLnpvb206aG92ZXIgew0KICB0cmFuc2Zvcm06IHNjYWxlKDIpOw0KfQ0KDQp0aCwgdGQge3BhZGRpbmc6IDVweDt9DQoNCjwvc3R5bGU+DQpgYGANCjxocj48L2hyPg0KDQpUaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGhlbHAgZmFtaWxpYXJpemUgeW91IHdpdGggc2ltcGxlIHdheXMgdG8gZXhwbG9yZSBhdHRyaWJ1dGVzIGluIHZhcmlvdXMgZGF0YXNldHMuIFRoZXNlIHNraWxscyB3aWxsIGhlbHAgeW91IGV4dHJhY3QgbmV3IGRhdGFzZXRzLCBjb25uZWN0IHRvIHRhYnVsYXIgZGF0YSwgYW5kIHF1YWxpdGF0aXZlbHkgY29tcGFyZSBkaWZmZXJlbnQgdmFyaWFibGVzLg0KDQojIFRoZSBJbnRyb2R1Y3Rpb24NCg0KV2l0aCB0aGUgdW5wcmVjZWRlbnRlZCBncm93dGggaW4gbWlkZGxlIFRlbm5lc3NlZSwgdGhlIE1vbnRnb21lcnkgQ291bnR5IENvbW1pc3Npb24sIFN0b3Jtd2F0ZXIgTWFuYWdlbWVudCwgYW5kIEhlYWx0aCBEZXBhcnRtZW50IGFyZSB3b3JraW5nIHdpdGggdGhlIFRlbm5lc3NlZSBEZXBhcnRtZW50IG9mIEVudmlyb25tZW50IGFuZCBDb25zZXJ2YXRpb24gb24gYW4gaW5pdGlhdGl2ZSB0byBhc3Nlc3MgdGhlIHJlbGF0aW9uc2hpcCBvZiBicm93bmZpZWxkIHNpdGVzIHRvIG91ciBjb21tdW5pdHkgYW5kIHdhdGVyc2hlZHMuIEJyb3duZmllbGRzIGFyZSBsb2NhdGlvbnMgaW4gY29tbXVuaXRpZXMgdGhhdCBwb3NlIHJpc2tzIHRvIGZ1dHVyZSBsYW5kIHVzZSBhbmQgZGV2ZWxvcG1lbnQgYXMgYSByZXN1bHQgb2YgcHJldmlvdXMgbGFuZCB1c2UgcHJhY3RpY2VzLCBwYXJ0aWN1bGFybHkgY29tbWVyY2lhbCBhbmQgaW5kdXN0cmlhbCAoY2hlY2sgb3V0IG1vcmUgaW5mb3JtYXRpb24gb24gYnJvd25maWVsZHMgaGVyZTogW2h0dHBzOi8vd3d3Lm9zaGEuZ292L2Jyb3duZmllbGRzL2Jyb3duZmllbGRzLXFuYV0oaHR0cHM6Ly93d3cub3NoYS5nb3YvYnJvd25maWVsZHMvYnJvd25maWVsZHMtcW5hKSkuIFRoZXkgb2Z0ZW4gY29udGFpbiBoaWdoIGxldmVscyBvZiBzb2lsIGFuZCB3YXRlciBjb250YW1pbmF0aW9uLCBhbmQgaW4gc29tZSBjYXNlcyBwb2xsdXRhbnRzIGNhbiByZW1haW4gaW4gdGhlIGVjb3N5c3RlbSBmb3IgZGVjYWRlcy4gVW5mb3J0dW5hdGVseSwgYnJvd25maWVsZHMgYXJlIG9mdGVuIHBvaW50IHNvdXJjZSBsb2NhdGlvbnMgZm9yIGdyb3VuZCBhbmQgc3VyZmFjZSB3YXRlciBjb250YW1pbmF0aW9uLiANClRoZSBnb2FsIG9mIHRoZSBpbml0aWF0aXZlIGlzIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IHNwYXRpYWwgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZXNlIGhhemFyZG91cyBsb2NhdGlvbnMgdGhhdCBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gaW1wYWN0IGN1cnJlbnQgYW5kIGZ1dHVyZSByZXNpZGVudHMgb2YgdGhlIGFyZWEuIFRoZSBwcmltYXJ5IG9iamVjdGl2ZXMgb2YgdGhlIGluaXRhdGl2ZSBhcmUgdG86IGEpIGV4YW1pbmUgdGhlIGxvY2F0aW9uIG9mIGJyb3duZmllbGRzIGluIHRoZSBjb3VudHksIGIpIGRldGVybWluZSB3aGljaCB3YXRlcnNoZWRzIHdvdWxkIGJlIHByaW1hcmlseSBpbXBhY3RlZCwgYW5kIGMpIGFzY2VydGFpbiBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJyb3duZmllbGQgc2l0ZXMgYW5kIGFueSBwYXJ0aWN1bGFyIGRlbW9ncmFwaGljcyBpbiB0aGUgY291bnR5LiBXaXRoIHRoZXNlIHRocmVlIG9iamVjdGl2ZXMsIHRoZSBjb3VudHkgcGFydG5lcnMgbWF5IG1ha2UgZGF0YS1pbmZvcm1lZCBkZWNpc2lvbnMgdG8gYmVzdCBzdXBwb3J0IGFuZCBwcmlvcml0aXplIHByb2dyYW1zIHRoYXQga2VlcCBvdXIgY29tbXVuaXR5IGFuZCBlbnZpcm9ubWVudCBzYWZlLg0KDQpJbiB0aGlzIGV4ZXJjaXNlIHlvdSB3aWxsOg0KDQotICAgQ29udGludWUgd29ya2luZyB3aXRoIGdlb3Byb2Nlc3NpbmcgdG9vbHMNCi0gICBPYnRhaW4gYW5kIGltcG9ydCBkYXRhIGZyb20gZXh0ZXJuYWwgc291cmNlcw0KLSAgIExlYXJuIHRvIGxpbmsgdGFidWxhciBkYXRhDQotICAgUXVhbGl0YXRpdmVseSBjb21wYXJlIGRhdGFzZXRzDQoNClNvZnR3YXJlIHNwZWNpZmljIGRpcmVjdGlvbnMgY2FuIGJlIGZvdW5kIGZvciBlYWNoIHN0ZXAgYmVsb3cuIFBsZWFzZSBzdWJtaXQgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpb25zIGFuZCB5b3VyIGZpbmFsIG1hcCBieSB0aGUgZHVlIGRhdGUuDQoNCiMjIFN0ZXAgT25lOiBUaGUgRGF0YQ0KDQpUaGUgZGF0YXNldHMgdXNlZCBpbiB0aGlzIGV4ZXJjaXNlIHdpbGwgYmUgZm91bmQgb24gdGhlIFtFeGVyY2lzZSA1XShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtNSkgR2l0aHViIFBhZ2UsIHByZXZpb3VzIGV4ZXJjaXNlcyBzdWNoIGFzIFtFeGVyY2lzZSAyXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtMikgYW5kIFtFeGVyY2lzZSAzXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtMyksIGFuZCBhbHNvIGZyb20gdGhlIFtUZW5uZXNzZWUgR2VvZ3JhcGhpYyBJbmZvcm1hdGlvbiBDb3VuY2lsXShodHRwOi8vd3d3LnRuZ2lzLm9yZy9kYXRhLWNvbGxlY3Rpb25zLmh0bSkuICoqVE4gR0lTKiogbWFpbnRhaW5zIGEgbnVtYmVyIG9mIGRhdGFzZXRzIGluIHRoZWlyIGNvbGxlY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCBmb3IgcHJvamVjdHMgaW52b2x2aW5nIHRoZSBzdGF0ZSBvZiBUZW5uZXNzZWUuIA0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpBcyB3aXRoIHByZXZpb3VzIGV4ZXJjaXNlcyB5b3Ugc2hvdWxkIGJlZ2luIGJ5IGxhdW5jaGluZyBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSwgY3JlYXRpbmcgYSBuZXcgYmxhbmsgdGVtcGxhdGUsIGFuZCBjcmVhdGluZyBhIGZvbGRlciBmb3IgdGhpcyBzcGVjaWZpYyBleGVyY2lzZS4gWW91IHNob3VsZCBub3cgc2VlIHRoZSB0eXBpY2FsIHN0YXJ0aW5nIHNjcmVlbiB0aGF0IGdyZWV0ZWQgeW91IGluIGFsbCBvZiB0aGUgcHJldmlvdXMgZXhlcmNpc2VzLiBXaGlsZSBzb21lIG9mIHRoZSBkYXRhIHlvdSBtYXkgYWxyZWFkeSBoYXZlIGluIHByZXZpb3VzIGV4ZXJjaXNlIGZvbGRlcnMsIHlvdSB3aWxsIHN0YXJ0IGhpcyBsYWIgYnkgZG93bmxvYWRpbmcgYSBkYXRhc2V0IGZyb20gKipUTiBHSVMqKi4gV2hpbGUgdGhleSBtYWludGFpbiBhIG51bWJlciBvZiBxdWFsaXR5IGNvbGxlY3Rpb25zLCB5b3Ugd2lsbCBzcGVjaWZpY2FsbHkgZG93bmxvYWQgdGhlIF9zdGF0ZXdpZGUgd2F0ZXJzaGVkIGNvdmVyYWdlICgxMiBkaWdpdCBIeWRyb2xvZ2ljIFVuaXQgQ29kZSlfIGZvciBUZW5uZXNzZWUuIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IHRoZSBmb2xsb3dpbmcgbGluazogW2h0dHA6Ly93d3cudG5naXMub3JnL3dhdGVyLmh0bV0oaHR0cDovL3d3dy50bmdpcy5vcmcvd2F0ZXIuaHRtKS4gT24gdGhhdCBwYWdlIHlvdSB3aWxsIGZpbmQgdGhlIGxpbmsgZm9yICoqIkRvd25sb2FkIFdhdGVyc2hlZCBDb3ZlcmFnZSIqKi4gQ2xpY2sgdGhlIGxpbmssIGFuZCB1c2luZyB0aGUgZG93bmxvYWQgYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL2dvb2dsZS1kcml2ZS1kb3dubG9hZC5qcGciIGFsdD0iR29vZ2xlIERyaXZlIERvd25sb2FkIEJ1dHRvbiIgd2lkdGggPSAiMjAiIGhlaWdodCA9ICIyMCI+IGluIHRoZSB1cHBlci1yaWdodCBjb3JuZXIsIHNhdmUgdGhlIF90bl93YmRfIHppcCBmaWxlIHRvIHlvdXIgcHJvamVjdCBmb2xkZXIuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL3RuZ2lzLXdlYnNpdGUucG5nIiBhbHQ9IlROIEdJUyBXYXRlciBEYXRhIERvd25sb2FkIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9wPg0KDQpPbmNlIHlvdSBoYXZlIGRvd25sb2FkZWQgdGhlIGZpbGUsIG5hdmlnYXRlIHRvIHRoZSBzYXZlZCBsb2NhdGlvbiB0byB1bnppcCB0aGUgZmlsZS4gV2l0aGluIHRoZSB1bnppcHBlZCBmb2xkZXIgeW91IHdpbGwgZmluZCB0aHJlZSBhZGRpdGlvbmFsIGZvbGRlcnMgdGl0bGVkOg0KDQotIHRuXzhkaWdfaHVjDQotIHRuXzEyZGlnX2h1Yw0KLSB0bl8yNTBrX2h1Yw0KDQpUaGVzZSBhcmUgd2F0ZXJzaGVkIGZpbGVzIGF0IHZhcnlpbmcgbGV2ZWxzIG9mIGRldGFpbC4gRm9yIGh5ZHJvbG9naWMgdW5pdHMgeW91IGFyZSBsb29raW5nIGZvciBvbmUgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgZGlnaXRzIHRvIGdldCB0aGUgbGFyZ2VzdCBzY2FsZSBkYXRhLiBTbyBmb3IgdGhpcyBleGVyY2lzZSB5b3Ugd2lsbCB1bnppcCB0aGUgKip0bl8xMmRpZ19odWMqKiBkYXRhc2V0Lg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9zZWNvbmQtdW56aXAuanBnIiBhbHQ9InRuXzEyZGlnX2h1Yy56aXAgZXh0cmFjdCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvcD4NCg0KRmluYWxseSwgd2l0aCB0aGF0IGZpbmFsIGZvbGRlciBleHRyYWN0ZWQgeW91IHdpbGwgZmluZCBhIGZvbGRlciB0aXRsZWQgX2h5ZHJvbG9naWNfdW5pdHNfIHRoYXQgd2lsbCBjb250YWluIGEgc2hhcGVmaWxlIG5hbWVkICoqd2JkaHUxMl9hX3RuLnNocCoqIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoaXMgZXhlcmNpc2UuIFRoaXMgaXMgdGhlIHBvbHlnb24gZmlsZSByZXByZXNlbnRpbmcgdGhlIDEyIGRpZ2l0IGh5ZHJvbG9naWMgdW5pdCBjb2RlcyBmb3IgdGhlIGVudGlyZSBzdGF0ZSBvZiBUZW5uZXNzZWUuDQoNCk5leHQsIHlvdSB3aWxsIG5lZWQgdGhlIF90b3JuYWRvX2RhdGFfIGZpbGUgZnJvbSBFeGVyY2lzZSAyIGFuZCB0aGUgX2NlbnN1c190cmFjdHNfIGRhdGEgZnJvbSBFeGVyY2lzZSAzLiBZb3UgaGF2ZSBhIGZldyBvcHRpb25zIGZvciBvYnRhaW5pbmcgdGhpcyBkYXRhLiBZb3UgY2FuIGRvd25sb2FkIHRoZSBkYXRhIGFnYWluIChidXQgdGhpcyB0aW1lIHRvIHRoZSBuZXcgcHJvamVjdCBmb2xkZXIpLCB5b3UgY2FuIG5hdmlnYXRlIHRvIHRoZSBFeGVyY2lzZSAyIGFuZCBFeGVyY2lzZSAzIHByb2plY3QgZm9sZGVycywgcmVzcGVjdGl2ZWx5LCBvbiB5b3VyIGNvbXB1dGVyIGFuZCBjb3B5IHRoZSB6aXAgZmlsZXMgdG8gdGhlIEV4ZXJjaXNlIDUgcHJvamVjdCBmb2xkZXIsIG9yIHlvdSBjYW4gY29weSB0aGUgZGF0YSBvdmVyIHVzaW5nIHRoZSBjYXRhbG9nIHBhbmUgaW4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0uIFdoaWxlIHRoZSBmaXJzdCB0d28gb3B0aW9ucyBhcmUgcmVsYXRpdmVseSBzdHJhaWdodCBmb3J3YXJkLCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhcm4gaG93IHRvIG5hdmlnYXRlIGFuZCB1c2UgdGhlIGNhdGFsb2cgaW4gQXJjR0lTLiANCg0KT24gdGhlIF9WaWV3XyB0YWIsIGNsaWNrIHRoZSBDYXRhbG9nIFBhbmUgYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL2NhdGFsb2ctcGFuZS1idXR0b24uanBnIiBhbHQ9IkNhdGFsb25nIFBhbmUgQnV0dG9uIiB3aWR0aCA9ICIxNCIgaGVpZ2h0ID0gIjIwIj4gdG8gb3BlbiB0aGUgQ2F0YWxvZyBXaW5kb3cgUGFuZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2NyZWVuLiBPbiB0aGUgcHJvamVjdCB0YWIsIHJpZ2h0LWNsaWNrIG9uIHRoZSBmb2xkZXJzIG9wdGlvbiBhbmQgY2xpY2sgIkFkZCBGb2xkZXIgQ29ubmVjdGlvbi4gSW4gdGhlIHJlc3VsdGluZyB3aW5kb3cgbmF2aWdhdGUgdG8gdGhlIGZvbGRlciB5b3Ugd291bGQgbGlrZSB0byBjb25uZWN0IHRvIGFuZCBzaW5nbGUtY2xpY2sgdGhlIGZvbGRlciB0byBzZWxlY3QgaXQuIFlvdSBkb24ndCB3YW50IHRvIGRvdWJsZS1jbGljayBpbnRvIHRoZSBmb2xkZXIuIFlvdSBzaG91bGQgc2VlIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgYXBwZWFyIGF0IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdyBhbmQgdGhlIE9LIGJ1dHRvbiBzaG91bGQgYmUgYXZhaWxhYmxlLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9jYXRhbG9nLXBhbmUtd2luZG93cy5wbmciIGFsdD0iQWNjZXNzaW5nIENhdGFsb2cgUGFuZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvcD4NCg0KT25jZSB5b3UgaGF2ZSBjb25uZWN0ZWQgdG8gdGhlIGFkZGl0aW9uYWwgZm9sZGVycyB5b3Ugd2FudCB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGlzIHByb2plY3QgeW91IGNhbiBuYXZpZ2F0ZSB0byB0aGVtIHdpdGhpbiB0aGUgX0ZvbGRlcnNfIGxpbmsgaW4gdGhlIENhdGFsb2cgUGFuZS4gV2hpbGUgeW91IGNvdWxkIGFkZCBkYXRhIGRpcmVjdGx5IGZyb20gdGhlIG90aGVyIGZvbGRlcnMsIHRoZSBiZXN0IHByYWN0aWNlIG1pZ2h0IGJlIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSBvbmUgcHJvamVjdCB0byBhbm90aGVyLiBJZiBmb3IgZXhhbXBsZSB5b3UgcGxhbiB0byBhbHRlciB0aGUgZGF0YSB0aGVuIHVzaW5nIGl0IGRpcmVjdGx5IGZyb20gdGhlIHByZXZpb3VzIGZvbGRlciB3b3VsZCBhbHRlciBpdCB0aGVyZSBhcyB3ZWxsLiBUaGlzIGNvdWxkIGNhdXNlIGZ1dHVyZSBpc3N1ZXMgd2hlbiByZXR1cm5pbmcgdG8gdGhhdCBwcm9qZWN0LiBGb3IgdGhpcyBleGVyY2lzZSB5b3UgY2FuIG5hdmlnYXRlIHRvIHRoZSBFeGVyY2lzZSAyIGZvbGRlciBhbmQgY29weSB0aGUgX3Rvcm5hZG9fZGF0YV8gZmlsZSBhbmQgcGFzdGUgaXQgaW4gdGhlIEV4ZXJjaXNlIDUgZm9sZGVyLiBUaGlzIGlzIHRoZSBzYWZlc3Qgd2F5IHRvIG1vdmUgZGF0YSBzdWNoIGFzIHNoYXBlZmlsZXMgb3IgZ2VvZGF0YWJhc2VzLiBCZWNhdXNlIHRoZSB2YXJpb3VzIGRhdGEgdHlwZXMgY29udGFpbiBudW1lcm91cyBpbmRpdmlkdWFsIGZpbGVzIHRvIG1ha2UgdXAgYSBkYXRhc2V0LCBjYXRhbG9nIHdpbGwgY29weS9tb3ZlIHRoZW0gYWxsIGNvcnJlY3RseS4gSWYgeW91IHRyaWVkIHRvIG1vdmUgdGhlbSB1c2luZyBGaWxlIEV4cGxvcmVyIGFuZCBtaXNzZWQgb25lIG9mIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBkYXRhIGl0IG1pZ2h0IG5vdCB3b3JrIGFwcHJvcHJpYXRlbHkuIFNvIGZvciBFeGVyY2lzZSA1LCB5b3Ugd2lsbCBuZWVkIHRvIGNvcHkgdGhlIF90b3JuYWRvX2RhdGFfIGFuZCBfbW9udGNvX3RyYWN0c18gZGF0YSBmcm9tIGV4ZXJjaXNlcyB0d28gYW5kIHRocmVlIHJlc3BlY3RpdmVseS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvY2F0YWxvZy1jb3B5LXBhc3RlLnBuZyIgYWx0PSJDb3B5IGFuZCBQYXN0ZSBEYXRhIGluIENhdGFsb2cgUGFuZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KRmluYWxseSwgeW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCB0aGUgKipCcm93bmZpZWxkcyoqIGFuZCAqKkRlbW9ncmFwaGljcyoqIGRhdGEgZnJvbSB0aGUgW0V4ZXJjaXNlIDUsIEdpdEh1YiBEYXRhXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtNS90cmVlL21haW4vRGF0YSkgcGFnZS4gU2F2ZSBib3RoIGluIHlvdXIgRXhlcmNpc2UgNSBwcm9qZWN0IGZvbGRlciBhbmQgdW56aXAgdGhlICoqYnJvd25maWVsZHMuemlwKiogZmlsZSB0byBhY2Nlc3MgdGhlIGRhdGFzZXQuDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDE8L2I+PC9iaWc+PGJyPg0KVXNpbmcgKipGaWxlIEV4cGxvcmVyKiosIGV4YW1pbmUgdGhlIGRhdGFzZXQgY29udGFpbmVkIGluIHRoZSBfYnJvd25maWVsZHMuemlwXyBmaWxlIGFuZCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbjoNCjxibG9ja3F1b3RlPg0KV2hhdCBpcyB0aGUgY29tbW9uIG5hbWUgb2YgdGhlIGV4dHJhY3RlZCBmaWxlcz8gSG93IG1hbnkgYXJlIHRoZXJlPyBXaGF0IGFyZSB0aGUgdmFyaW91cyBmaWxlIGV4dGVuc2lvbnM/DQo8L2Jsb2NrcXVvdGU+DQo8c21hbGw+VGhlIGxpYnJhcnkgb2YgQ29uZ3Jlc3MgaGFzIGEgZ3JlYXQgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXMgZXh0ZW5zaW9ucyBbaGVyZV0oaHR0cHM6Ly93d3cubG9jLmdvdi9wcmVzZXJ2YXRpb24vZGlnaXRhbC9mb3JtYXRzL2ZkZC9mZGQwMDAyODAuc2h0bWwpLjwvc21hbGw+DQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1FHSVNde3N0eWxlPSJjb2xvcjogIzAwNjQwMCJ9IDwvYj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAxPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUl17c3R5bGU9ImNvbG9yOiAjNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQpCZWZvcmUgeW91IGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIG9wZW4gdGhlIFtFeDIgQ29sYWIgTm90ZWJvb2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS01L2Jsb2IvbWFpbi9HSVMxX0VYNS5pcHluYikgYW5kIGluc2VydCAqKnRvY29sYWIqKiBhZnRlciBfZ2l0aHViXyBpbiB0aGUgVVJMIHRvIG9wZW4gaW4gdGhlIF9Db2xhYiBFbnZpcm9ubWVudF8uIEFzIHlvdSBoYXZlIHNlZW4gYmVmb3JlLCBSIHJlcXVpcmVzIHZhcmlvdXMgcGFja2FnZXMgdG8gY29tcGxldGUgY2VydGFpbiBhbmFseXNlcy4gSW4gdGhpcyBleGVyY2lzZSB5b3Ugd2lsbCBiZSB1c2luZyAqKnRpZHl2ZXJzZSwgT3BlblN0cmVldE1hcHMsIGdnZm9ydGlmeSwgbWFwdG9vbHMsIGFuZCByZ2VvcyoqLiBUbyBpbnN0YWxsIGFuZCBsb2FkIHRoZSBwYWNrYWdlcyB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHNjcmlwdDoNCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDE8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQoNCiMjIFN0ZXAgVHdvOiBUaGUgQW5hbHlzZXMNCg0KVGhlIGRhdGEgY29sbGVjdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIHJlcXVpcmVzIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBzbyB5b3UgY2FuIHJlZHVjZSB0aGUgZGF0YXNldCB0byBvbmx5IHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhbmFseXNlcy4gSW4gdGhpcyBzdGVwIHlvdSB3aWxsIHVzZSBhZGRpdGlvbmFsIGdlb3Byb2Nlc3NpbmcgdGVjaG5pcXVlcyBhbmQgZGF0YSBtYW5hZ2VtZW50IHRvb2xzIHRvIGxpbmsgdHdvIGRhdGFzZXRzIGZvciBmdXJ0aGVyIGV4YW1pbmF0aW9uLg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpXaXRoIHRoZSBkYXRhIGNvbGxlY3RlZCB5b3UgY2FuIG5vdyBhZGQgdGhlIF9icm93bmZpZWxkc18sIGNlbnN1cyB0cmFjdHMsIF90b3JuYWRvX2RhdGFfLCBhbmQgX3diZGh1MTJfYV90bl8gKHdhdGVyc2hlZHMpIGRhdGEgdG8geW91ciBwcm9qZWN0LiBBbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygd2F5cyBvZiBpc29sYXRpbmcgZGF0YSB0byBtYWtlIGRlcml2ZWQgZGF0YXNldHMgKGUuZy4gU2VsZWN0ID4gTGFzc28gaW4gW0V4ZXJjaXNlIDQsIFN0ZXAgMV0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTFfU3RlcF9PbmU6X1RoZV9EYXRhKSksIGluIHRoaXMgZXhlcmNpc2UgeW91IHdpbGwgdXNlIGFub3RoZXIgdG9vbCBmcm9tIHRoZSAqKkdlb3Byb2Nlc3NpbmcqKiBUb29sYm94IHRvIGNvbXBsZXRlIHRoaXMgdGFzay4gT24gdGhlIF9WaWV3IFRhYl8gY2xpY2sgb24gdGhlIEdlb3Byb2Nlc3NpbmcgVG9vbGJveCBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvZ2VvcHJvY2Vzc2luZy1idXR0b24uanBnIiBhbHQ9Ikdlb3Byb2Nlc3NpbmcgQnV0dG9uIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4gdG8gb3BlbiB0aGUgR2VvcHJvY2Vzc2luZyBwYW5lIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4uIEJ5IG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgdG9vbHMgbWVudXMgeW91IHdpbGwgZmluZCAqKlNlbGVjdCoqIHVuZGVyIF9BbmFseXNpcyBUb29scyA+IEV4dHJhY3RfLiANCldpdGggdGhpcyB0b29sIHlvdSB3aWxsIHdyaXRlIGEgc2ltcGxlIGV4cHJlc3Npb24gdG8gInNlbGVjdCIgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSBkYXRhIHlvdSBuZWVkIGZvciBmdXJ0aGVyIGFuYWx5c2lzLiBUbyBkbyB0aGlzLCBkb3VibGUtY2xpY2sgdGhlIF9TZWxlY3RfIHRvb2wgYW5kIGluIHRoZSByZXN1bHRpbmcgcGFuZSBpbnB1dCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQoNCi0gSW5wdXQgRmVhdHVyZXMgPSB0b3JuYWRvX2RhdGFcKg0KLSBPdXRwdXQgRmVhdHVyZSBDbGFzcyA9IEhlcmUgeW91IHdpbGwgaW5zZXJ0IHRoZSBmaWxlIG5hbWUgeW91IHdhbnQgdG8gdXNlLiBDbGljayBvbiB0aGUgZm9sZGVyIGljb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBmaWVsZCBhbmQgaW4gdGhlIG5ldyB3aW5kb3cgc2F2ZSB0aGUgZmlsZSBhcyBfbW9udGdvbWVyeV9jb3VudHkuc2hwXyBpbiB5b3VyIHByb2plY3QgZm9sZGVyLg0KLSBFeHByZXNzaW9uID0gQ2xpY2sgdGhlIGRyb3AtZG93biBidXR0b24gZm9yIHRoZSBuZXcgZXhwcmVzc2lvbiA8aW1nIHNyYz0gIkltYWdlcy9uZXctZXhwcmVzc2lvbi1idXR0b24uanBnIiBhbHQ9IkV4cHJlc3Npb24gQnV0dG9uIiB3aWR0aCA9ICI4NyIgaGVpZ2h0ID0gIjIwIj4gYnV0dG9uIGFuZCB1c2UgdGhlIGRyb3AtZG93biBib3hlcyB0byBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246IA0KICAtIFdoZXJlIF9OQU1FXyAmbmJzcDsgX2lzIGVxdWFsIHRvXyAmbmJzcDsgX01vbnRnb21lcnlfDQogIC0gQ2xpY2sgUnVuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3NlbGVjdC1nZW9wcm9jZXNzaW5nLnBuZyIgYWx0PSJTZWxlY3QgR2VvcHJvY2Vzc2luZyBUb29sIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KXCpUaGUgdG9ybmFkbyBkYXRhc2V0IGlzIG9ubHkgYmVpbmcgdXNlZCB0byBvYnRhaW4gYSBwb2x5Z29uIGZvciBNb250Z29tZXJ5IENvdW50eSBmb3IgdGhlIGNsaXAgcHJvY2VzcyBpbiB0aGUgbmV4dCBzdGVwLiANCg0KVGhpcyB3aWxsIGFkZCB0aGUgbmV3ICoqbW9udGdvbWVyeV9jb3VudHkqKiBzaGFwZWZpbGUgdG8geW91ciBjb250ZW50cy4gWW91IGNhbiBub3cgcmVtb3ZlIHRoZSB0b3JuYWRvIGRhdGFzZXQgYmVjYXVzZSBpdCB3aWxsIG5vIGxvbmdlciBiZSBuZWVkZWQuIFdpdGggdGhlIHBvbHlnb24gb2YgTW9udGdvbWVyeSBDb3VudHkgYXZhaWxhYmxlIHlvdSBjYW4gbm93IHVzZSB0aGUgKipDbGlwKiogdG9vbCBsaWtlIGluIFtFeGVyY2lzZSA0LCBTdGVwIE9uZV0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTFfU3RlcF9PbmU6X1RoZV9EYXRhKSB0byBjbGlwIHRoZSBfYnJvd25maWVsZHNfIGFuZCBfd2F0ZXJzaGVkc18gZGF0YXNldHMgdG8gcmVkdWNlIHRoZW0gdG8gb25seSB0aG9zZSB3aXRoaW4gTW9udGdvbWVyeSBDb3VudHkuIElmIHlvdSByZWNlaXZlIGEgIkRhdHVtIGNvbmZsaWN0IiB3YXJuaW5nLCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZXhlcmNpc2UsIHlvdSBjYW4gaWdub3JlIGl0IGFuIGNvbnRpbnVlIHdpdGggdGhlIGNsaXAuIFJlY2FsbCB0aGF0IHRoZSBfSW5wdXQgRmVhdHVyZXNfIGlzIHRoZSBkYXRhIHlvdSB3YW50IHRvIHJlZHVjZSwgdGhlIF9DbGlwIEZlYXR1cmVfIGlzIHRoZSBkYXRhIHlvdSB3YW50IGl0IHRvIHRha2UgdGhlIHNoYXBlIG9mLCBhbmQgX091dHB1dCBGZWF0dXJlIENsYXNzXyBpcyB3aGF0IHlvdSBhcmUgbmFtaW5nIHRoZSBuZXcgZmlsZS4gUmVmZXIgYmFjayB0byBbRXhlcmNpc2UgNCwgU3RlcCBPbmVdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTQvIzExX1N0ZXBfT25lOl9UaGVfRGF0YSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ2xpcC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvY2xpcHBlZC1kYXRhLnBuZyIgYWx0PSJTZWxlY3QgQ2xpcHBlZCBEYXRhc2V0cyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KV2l0aCB0aGUgbmV3IGNsaXBwZWQgZGF0YXNldHMgeW91IGNhbiByZW1vdmUgb3IganVzdCB1bmNoZWNrIChpbiBjYXNlIHlvdSB3YW50IHRvIHVzZSB0aGVtIGluIHlvdXIgZmluYWwgbWFwKSB0aGUgZnVsbCBfYnJvd25maWVsZHNfIGFuZCBfd2F0ZXJzaGVkc18gZGF0YXNldHMgdG8gcmVkdWNlIGNsdXR0ZXIuIFlvdSBjYW4gYWxzbyBub3cgem9vbSBpbiBjbG9zZXIgdG8gdmlldyBvbmx5IE1vbnRnb21lcnkgQ291bnR5Lg0KDQpJbiB0aGUgZmluYWwgc3RlcCB0byBwcmVwYXJlIHRoZSBkYXRhLCB5b3UgYXJlIGdvaW5nIHRvIGNvbm5lY3QgYSBub24tc3BhdGlhbCBkYXRhIHRvIHRoZSBjZW5zdXMgdHJhY3QgZGF0YXNldC4gSW4gW1N0ZXAgT25lXShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS01LyMxMV9TdGVwX09uZTpfVGhlX0RhdGEpIHlvdSBkb3dubG9hZGVkIGEgZmlsZSB0aXRsZWQgKipkZW1vZ3JhcGhpY3MuY3N2KiouIFRoaXMgZmlsZSBjb250YWlucyBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIGRldGFpbGluZyBhZGRpdGlvbmFsIGRlbW9ncmFwaGljIGRhdGEgdGhhdCB5b3UgbmVlZCB0byBhcHBlbmQgdG8gdGhlIGNlbnN1cyB0cmFjdCBkYXRhLiBBbHRob3VnaCB0aGUgcHJvY2VzcyBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0LWZvcndhcmQsIHRoZXJlIGFyZSBhIG51bWJlciBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgdGFrZW4gaW4gb3JkZXIgdG8gam9pbiB0aGUgZGF0YS4NCg0KRmlyc3QsIGlmIHlvdSBoYXZlbid0IGFscmVhZHksIGFkZCB0aGUgX2RlbW9ncmFwaGljcy5jc3ZfIGZpbGUgdG8geW91ciB0YWJsZSBvZiBjb250ZW50cy4gVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHRoZSBDYXRhbG9nIFBhbmUgb3Igd2l0aCB0aGUgIkFkZCBEYXRhIiBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWFkZC1kYXRhLWJ1dHRvbi5wbmciIGFsdD0iQWRkIERhdGEgQnV0dG9uIiB3aWR0aCA9ICIxNiIgaGVpZ2h0ID0gIjIwIj4gbGlrZSBpbiBwcmV2aW91cyBleGVyY2lzZXMuIEJlY2F1c2UgW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0gdHJlYXRzIFwqLmNzdiBmaWxlcyBhcyAicmVhZCBvbmx5IiB5b3UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIGEgdGFibGUgdGhhdCBjYW4gYmUgZWRpdGVkIGluIHRoZSBzb2Z0d2FyZS4gTm93LCByaWdodC1jbGljayBvbiB0aGUgX2RlbW9ncmFwaGljcy5jc3ZfIHN0YW5kYWxvbmUgdGFibGUgYW5kIGdvIHRvICoqRGF0YSA+IEV4cG9ydCBUYWJsZSoqLiBJbiB0aGUgcmVzdWx0aW5nIHdpbmRvdyBjaG9vc2UgdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KDQotIElucHV0IFJvd3MgPSBkZW1vZ3JhcGhpY3MuY3N2DQotIE91dHB1dCBMb2NhdGlvbiA9IFNpbWlsYXIgdG8gYmVmb3JlLCBuYXZpZ2F0ZSBvbmx5IHRvIHlvdXIgcHJvamVjdCBmb2xkZXIgYW5kIGNsaWNrIG9uY2UgdG8gc2VsZWN0LiBJbiB0aGUgc3RlcCB5b3UgYXJlIHNpbXBseSBkZXNpZ25hdGluZyB0aGUgZm9sZGVyIHRoZSBmaWxlIGlzIHRvIGJlIHNhdmVkLg0KLSBPdXRwdXQgTmFtZSA9IEdpdmUgdGhlIGZpbGUgYSBuZXcgbmFtZSBzdWNoIGFzIGRlbW9fdGFibGUuZGJmDQoNCkJlZm9yZSBjbGlja2luZyBPSywgeW91IG5lZWQgdG8gZXhwYW5kIHRoZSAqKkZpZWxkcyoqIHNlY3Rpb24gb2YgdGhlIHdpbmRvdyBhbmQgY2xpY2sgb24gX1RyYWN0XyBpbiB0aGUgT3V0cHV0IEZpZWxkcyBjb2x1bW4uIFRoZW4gY2xpY2sgb24gdGhlIF9Qcm9wZXJ0aWVzXyBUYWIgYW5kIGNoYW5nZSB0aGUgKipUeXBlKiogZmllbGQgdG8gX1RleHRfLiBUaGVuIGNsaWNrIE9LLiBJZiB5b3UgY29udGludWVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGZpZWxkIHR5cGUsIHRoZSB2YXJpYWJsZSB3b3VsZCBtb3N0IGxpa2VseSBiZSB0cmVhdGVkIGFzIGEgbnVtZXJpY2FsIHZhbHVlLiBJZiB5b3Ugb3BlbiB0aGUgYXR0cmlidXRlIHRhYmxlIGZvciBhbnkgZGF0YXNldCBhbmQgbW91c2Utb3ZlciB0aGUgdmFyaWFibGUgY29sdW1uIHdpdGhvdXQgY2xpY2tpbmcgYSBwb3AtdXAgd2luZG93IHdpbGwgYXBwZWFyIGRldGFpbGluZyB0aGUgX1R5cGVfIGFuZCBvdGhlciBwYXJhbWV0ZXJzIG9mIHRoZSB2YXJpYWJsZS4gSW4gdGhlIGNlbnN1cyBkYXRhc2V0IGZyb20gdGhlIHByZXZpb3VzIGV4ZXJjaXNlLCB0aGUgX05BTUVfIHZhcmlhYmxlIGlzIFR5cGU6IFRleHQgKDcpLiBUaGUgc2V2ZW4gaW4gcGFyZW50aGVzaXMgbWVhbnMgdGhlIG1heCBudW1iZXIgb2YgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaXMgc2V2ZW4uIFNvIGJlZm9yZSB5b3UgZXhwb3J0IGEgdGFibGUgaXQgaXMgZ29vZCBwcmFjdGljZSB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBtYXRjaCB0aGUgdmFyaWFibGVzIHlvdSBpbnRlbmQgdG8gam9pbiBvciB0aGF0IHRoZSB2YXJpYWJsZXMgd2lsbCBiZSB0cmVhdGVkIGluIGEgbWFubmVyIG5lY2Vzc2FyeSBmb3IgYWRkaXRpb25hbCBhbmFseXNlcy4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy10YWJsZS1leHBvcnQucG5nIiBhbHQ9IkV4cG9ydCBDU1YgdG8gREJGIiBzdHlsZT0id2lkdGg6OTAlIj48L3A+DQoNClRoZSBuZXcgc3RhbmRhbG9uZSB0YWJsZSBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBUYWJsZSBvZiBDb250ZW50cy4gSWYgbm90IHlvdSBzaG91bGQgYWRkIGl0IG5vdzsgdGhlIGNzdiB0YWJsZSBjYW4gYmUgcmVtb3ZlZC4gTm93IHlvdSBjYW4gY29ubmVjdCB0aGUgbmV3IHRhYmxlIHRvIHRoZSBjZW5zdXMgdHJhY3QgZGF0YXNldC4gQmVnaW4gYnkgcmlnaHQtY2xpY2tpbmcgb24gdGhlIGNlbnN1cyBkYXRhIGFuZCBzZWxlY3RpbmcgKipKb2lucyBhbmQgUmVsYXRlcyA+IEFkZCBKb2luKiouIEluIHRoZSBuZXcgX0FkZCBKb2luXyB3aW5kb3cgc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyAoeW91ciBmaWxlIG5hbWVzIG1heSB2YXJ5KToNCg0KLSBJbnB1dCBUYWJsZSA9IG1vbnRjb190cmFjdHMsIG9yIHdoYXRldmVyIHlvdSBuYW1lZCB0aGUgY2Vuc3VzIHRyYWN0IGluZm9ybWF0aW9uDQotIElucHV0IEpvaW4gRmllbGQgPSBOQU1FDQotIEpvaW4gVGFibGUgPSBkZW1vX3RhYmxlLCBvciB3aGF0ZXZlciB5b3UgbmFtZWQgdGhlIG5ldyBkZW1vZ3JhcGhpY3MgZGF0YQ0KLSBKb2luIFRhYmxlIEZpZWxkID0gVHJhY3QNCg0KRm9yIHRoaXMgZXhlcmNpc2Uga2VlcCB0aGUgIktlZXAgQWxsIFRhcmdldCBGZWF0dXJlcyIgYnV0dG9uIGNoZWNrZWQgYW5kIGlmIHlvdSByZWNlaXZlIGFuIHdhcm5pbmcgYWJvdXQgYW4gaW5kZXhpbmcgZXJyb3Igd2l0aCB0aGUgY2Vuc3VzIGRhdGEgeW91IGNhbiBpZ25vcmUgaXQgZm9yIHRoaXMgZXhlcmNpc2UuIFRoZW4gY2xpY2sgdGhlIF9WYWxpZGF0ZSBKb2luXyBidXR0b24uIFRoaXMgd2lsbCBwb3AtdXAgYW4gbmV3IHdpbmRvdyB0aGF0IHdpbGwgZGVzY3JpYmUgdGhlIHByb2Nlc3Mgb2YgY2hlY2tpbmcgdGhlIHR3byBkYXRhc2V0cyB0byBzZWUgaWYgdGhleSBjYW4gYmUgam9pbmVkLiBBdCB0aGUgYm90dG9tIG9mIHRoZSBkaWFsb2cgeW91IHNob3VsZCBzZWUgYSBsaW5lIHRoYXQgc2F5cyB0aGVyZSB3ZXJlIDM5IGpvaW5zLiBDbG9zZSB0aGF0IG1lc3NhZ2UgYW5kIGNsaWNrIE9LIHRvIHJ1biB0aGUgam9pbi4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWpvaW4ucG5nIiBhbHQ9IkpvaW4gRGF0YXNldHMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCkZpbmFsbHksIG9wZW4gdGhlIGF0dHJpYnV0ZSB0YWJsZSBmb3IgdGhlIGNlbnN1cyB0cmFjdHMgYW5kIHNjcm9sbCB0byB0aGUgZmFyIHJpZ2h0IG9mIHRoZSB0YWJsZS4gSWYgdGhlIGpvaW4gd29ya2VkIHByb3Blcmx5IHlvdSBzaG91bGQgc2VlIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZmllbGRzIGFkZGVkIHRvIHRoZSB0YWJsZS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWpvaW5lZC10YWJsZS5wbmciIGFsdD0iSm9pbiBEYXRhc2V0cywgQXR0cmlidXRlIFRhYmxlIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpUaGlzIHdpbGwgcHJvdmlkZSBhbGwgb2YgdGhlIGRhdGEgYW5kIGluZm9ybWF0aW9uIHlvdSBuZWVkIHRvIHZpc3VhbGl6ZSB0aGUgZGF0YSBhbmQgbWFrZSBjb21wYXJpc29ucyBvZiB0aGUgd2F0ZXJzaGVkcy4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMjwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KSG93IG1hbnkgd2F0ZXJzaGVkcyBjb3ZlciBNb250Z29tZXJ5IENvdW50eT8gQWx0aG91Z2ggdGhleSBoYXZlIGJlZW4gY2xpcHBlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGdlb21ldHJ5LCB3aGljaCB3YXRlcnNoZWQgaXMgdGhlIGxhcmdlc3Q/IFdoaWNoIGlzIHRoZSBzbWFsbGVzdD8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IERpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6IzAwNjQwMCJ9IDwvYj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAyPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IERpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAyPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIyBTdGVwIFRocmVlOiBUaGUgVmlzdWFsaXphdGlvbg0KDQpJbiB0aGlzIHN0ZXAgeW91IHdpbGwgbmVlZCB0byBleGFtaW5lIHRoZSBzcGF0aWFsIGRpc3RyaWJ1dGlvbiBvZiBicm93bmZpZWxkcyB3aXRoaW4gdGhlIHdhdGVyc2hlZHMgb2YgTW9udGdvbWVyeSBDb3VudHkgYW5kIG1ha2Ugc29tZSBxdWFsaXRhdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgcG90ZW50aWFsbHkgaW1wYWN0ZWQgdXJiYW4gYXJlYXMuIA0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNCkV4YW1pbmUgdGhlIHNwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIHRoZSBicm93bmZpZWxkIHRocm91Z2hvdXQgdGhlIGNvdW50eS4gVGhlIGNsdXN0ZXJpbmcgc2hvdWxkIGJlIHJlbGF0aXZlbHkgYXBwYXJlbnQgYW5kIG1pZ2h0IG1hdGNoIHVwIHdpdGggeW91ciBrbm93bGVkZ2Ugb2YgaW5kdXN0cmlhbCBhY3Rpdml0aWVzIGluIHRoZSB2YXJpb3VzIGFyZWFzIG9mIE1vbnRnb21lcnkgQ291bnR5LiBJbiBvcmRlciB0byBoZWxwIHF1YW50aWZ5IHRoZSBudW1iZXIgb2YgYnJvd25maWVsZHMgaW4gZWFjaCB3YXRlcnNoZWQgeW91IGNhbiB1c2UgYSAqKlNwYXRpYWwgam9pbioqIHRvIGNyZWF0ZSBhIGNvdW50IHZhcmlhYmxlIGZvciB0aGlzIGluZm9ybWF0aW9uLiBUbyBkbyB0aGlzLCByaWdodC1jbGljayBvbiB0aGUgX21vbnRnb21lcnkgY291bnR5IHdhdGVyc2hlZF8gZGF0YXNldCBhbmQgZ28gdG8gX0pvaW4gYW5kIFJlbGF0ZXMgPiBTcGF0aWFsIEpvaW5fDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1zcGF0aWFsLWpvaW4ucG5nIiBhbHQ9IlNwYXRpYWwgSm9pbiBEYXRhc2V0cyIgc3R5bGU9IndpZHRoOjg1JSI+PC9wPg0KDQpJbiB0aGUgcmVzdWx0aW5nIHdpbmRvdywgc2VsZWN0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyAoeW91ciBmaWxlIG5hbWVzIG1heSB2YXJ5KToNCg0KLSBUYXJnZXQgRmVhdHVyZXMgPSBtb250Z29tZXJ5IGNvdW50eSB3YXRlcnNoZWRzDQotIEpvaW4gRmVhdHVyZXMgPSBtb250Z29tZXJ5IGNvdW50eSBicm93bmZpZWxkcw0KLSBPdXRwdXQgRmVhdHVyZSBDbGFzcyA9IFRoaXMgaXMgd2hlcmUgeW91IG5hbWUgdGhlIG5ldyBkYXRhc2V0LiBGb3IgY29udGludWl0eSB5b3UgY2FuIG5hbWUgaXQgc29tZXRoaW5nIGxpa2U6IGJyb3duZmllbGRzX3Blcl93YXRlcnNoZWQuc2hwDQotIEpvaW4gT3BlcmF0aW9uID0gQ2hvb3NlICJKb2luIG9uZSB0byBvbmUiIGZyb20gdGhlIGRyb3AtZG93biBtZW51DQogIC0gS2VlcCBhbGwgVGFyZ2V0IEZlYXR1cmVzIHNob3VsZCByZW1haW4gY2hlY2tlZA0KTWF0Y2ggT3B0aW9uID0gQ2hvb3NlICJJbnRlcnNlY3QiIGZyb20gdGhlIGRyb3AtZG93biBtZW51DQoNCllvdSBjYW4gbGVhdmUgdGhlIHJlbWFpbmluZyBpdGVtcyBibGFuayBhbmQgY2xpY2sgT0suDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1zcGF0aWFsLWpvaW4tcGFuZS5wbmciIGFsdD0iU3BhdGlhbCBKb2luIERhdGFzZXRzIERpYWxvZyIgc3R5bGU9IndpZHRoOjg1JSI+PC9wPg0KDQogQnkgZXhhbWluaW5nIHRoZSBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoZSBuZXcgZGF0YXNldCB5b3Ugc2hvdWxkIHNlZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgKipKb2luX0NvdW50KiouIFRoaXMgaXMgdGhlIG51bWJlciBvZiBicm93bmZpZWxkcyB0aGF0IG9jY3VyIHdpdGhpbiBlYWNoIHdhdGVyc2hlZC4NCiANClVzaW5nIHRoZSBza2lsbHMgeW91IGxlYXJuZWQgaW4gRXhlcmNpc2VzIFtUd29dKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTIvKSwgW1RocmVlXShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS0zLyksIGFuZCBbRm91cl0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8pIHlvdSBjYW4gbm93IG1ha2UgYSBtYXAgdGhhdCBzaG93cyBNb250Z29tZXJ5IENvdW50eSwgdGhlIGxvY2F0aW9uIG9mIGJyb3duZmllbGRzIGFuZCB3YXRlcnNoZWRzIGluIGEgZ3JhZHVhdGVkIGNvbG9yIHNjaGVtZSBieSBudW1iZXIgb2YgYnJvd25maWVsZHMuIFJlbWVtYmVyIHRvIGluY2x1ZGUgY2FydG9ncmFwaGljIGVsZW1lbnRzIHN1Y2ggYXMgbGVnZW5kLCBzY2FsZSBiYXIsIG5vcnRoIGFycm93LCBldGMuIEluIHRoaXMgdmlzdWFsaXphdGlvbiB5b3UgbWF5IGFsc28gd2FudCB0byBhZGQgYSBkaWZmZXJlbnQgYmFzZW1hcCBvciBpbnNldCBtYXAgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDM8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCldoaWNoIHdhdGVyc2hlZCBjb250YWlucyB0aGUgbW9zdCBicm93bmZpZWxkcz8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDM8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMzwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCg0KIyMgU3RlcCBGb3VyOiBUaGUgQ291bnR5IENvbW1pc3NvbiBSZXBvcnQNCg0KQWZ0ZXIgZGlzY3Vzc2luZyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgYW5hbHlzaXMgd2l0aCB5b3VyIGNvbGxlYWd1ZXMgYXQgQ291bnR5IENvbW1pc3Npb24sIFN0b3Jtd2F0ZXIgTWFuYWdlbWVudCwgSGVhbHRoIERlcGFydG1lbnQsIGFuZCBUREVDLCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIHNlZWluZyBob3cgdGhlIGxvY2F0aW9uIG9mIGJyb3duZmllbGRzIGltcGFjdHMgdGhlIGNvbW11bml0eS4gQWx0aG91Z2ggdGhlIFtjb21taXNzaW9uIGRpc3RyaWN0c10oaHR0cHM6Ly9tY2d0bi5vcmcvc3RvcmFnZS9kZXBhcnRtZW50cy9jb21taXNzaW9uL21hcHMvRGlzdHJpY3RNYXAucGRmKSBkbyBub3QgcGVyZmVjdGx5IHJlcGxpY2F0ZSB0aGUgY2Vuc3VzIHRyYWN0cywgdGhlIENvdW50eSBDb21taXNzaW9uZXJzIGFuZCB0aGUgSGVhbHRoIERlcGFydG1lbnQgd2FudCB0byBrbm93IGlmIHRoZSBicm93bmZpZWxkIHNpdGVzIGFyZSBkaXJlY3RseSByZWxhdGVkIHRvIGNlbnN1cyB0cmFjdHMgd2l0aCBsYXJnZSBtaW5vcml0eSBwb3B1bGF0aW9ucy4gVGhleSBhcmUgY29uY2VybmVkIGJ5IGEgW3JlY2VudGx5IHB1Ymxpc2hlZCByZXBvcnRdKGh0dHBzOi8vd3d3LmVwYS5nb3YvY2xlYW51cHMvb2xlbS1wcm9ncmFtcy1hZGRyZXNzLWNvbnRhbWluYXRpb24tc3VwZXJmdW5kLWJyb3duZmllbGRzLWFuZC1yY3JhLXNpdGVzLW5lYXItNjAtcGVyY2VudC11cykgdGhhdCBzdGF0ZXM6DQoNCj4gIldoaWxlIHRoZXJlIGlzIG5vIHNpbmdsZSB3YXkgdG8gY2hhcmFjdGVyaXplIGNvbW11bml0aWVzIGxvY2F0ZWQgbmVhciBvdXIgc2l0ZXMsIHRoaXMgcG9wdWxhdGlvbiBpcyBtb3JlIG1pbm9yaXR5LCBsb3cgaW5jb21lLCBsaW5ndWlzdGljYWxseSBpc29sYXRlZCwgYW5kIGxlc3MgbGlrZWx5IHRvIGhhdmUgYSBoaWdoIHNjaG9vbCBlZHVjYXRpb24gdGhhbiB0aGUgVS5TLiBwb3B1bGF0aW9uIGFzIGEgd2hvbGUuIEFzIGEgcmVzdWx0LCB0aGVzZSBjb21tdW5pdGllcyBtYXkgaGF2ZSBmZXdlciByZXNvdXJjZXMgd2l0aCB3aGljaCB0byBhZGRyZXNzIGNvbmNlcm5zIGFib3V0IHRoZWlyIGhlYWx0aCBhbmQgZW52aXJvbm1lbnQuIg0KDQpEdXJpbmcgdGhlc2UgZGlzY3Vzc2lvbnMgdGhlIEhlYWx0aCBEZXBhcnRtZW50IHdvdWxkIGFsc28gbGlrZSB0byBrbm93IGlmIHRoZSBhcmVhcyB3aXRoIGEgaGlnaCBudW1iZXIgb2YgYnJvd25maWVsZHMgaGF2ZSBoaWdoZXIgcG9wdWxhdGlvbnMgb2YgY2hpbGRyZW4uDQoNCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtBcmNHSVMgUHJvXXtzdHlsZT0iY29sb3I6I2ZmNDUwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpVc2luZyB0aGUgc2tpbGxzIHlvdSBsZWFybmVkIGluIHRoaXMgYW5kIHByZXZpb3VzIGV4ZXJjaXNlcywgY3JlYXRlIGEgbmV3IHNwYXRpYWwgam9pbiBiZXR3ZWVuIHRoZSBfY2Vuc3VzIHRyYWN0c18gYW5kIF9icm93bmZpZWxkc18gZGF0YXNldHMgKGZvciB0aGlzIGV4ZXJjaXNlIGlnbm9yZSBhbnkgZGF0dW0gd2FybmluZykuIA0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiA0PC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDQ8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gNDwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCg0KIyBUaGUgV3JpdGUtVXANCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCldoZW4gY29tcGxldGUsIHNlbmQgYSBsaW5rIHRvIHlvdXIgX0NvbGFiIE5vdGVib29rXyBvciB3b3JkIGRvY3VtZW50IHdpdGggYW5zd2VycyB0byBRdWVzdGlvbnMgMS00IGFuZCB5b3VyIGNvbXBsZXRlZCBtYXAgdmlhIGVtYWlsLg==